#include "ventanaconexion.h"

VentanaConexion :: VentanaConexion(Cliente &cl): cliente(cl){
	
	error = false;
	control = 0;
}

bool VentanaConexion :: mostrar(){
	
	string ipTemp(""), puertoTemp("");
	bool termino = false;
	int response;

	//primera parte
	Gtk::HBox hServidor;
	Gtk::Label label1("Introduzca los datos del servidor: ");
	Gtk::Label lIP("IP: ");
	Gtk::Entry entradaIP;
	Gtk::StockID id("Conectarse");

	this->set_title("Conectarse a una partida existente");
	hServidor.pack_start(lIP, false, true, 0);
	hServidor.pack_start(entradaIP, true, true, 10);
	this->get_vbox()->pack_start(label1);
	this->get_vbox()->pack_start(hServidor);
	botonConectarse = this->add_button(id, Gtk::RESPONSE_ACCEPT);
	this->add_button("Cancelar", Gtk::RESPONSE_CANCEL);
	
	
	this->show_all();
	this->set_modal(true);
	
	while(!termino){
		entradaIP.set_text(ipTemp);
		response = this->run();
		
		//boton CONECTARSE
		if(response == Gtk::RESPONSE_ACCEPT){
			ipTemp = entradaIP.get_text();
			if(entradaIP.get_text_length() != 0){
				cliente.conectar(ipTemp, PUERTO);
				termino = true;
			}
		}
		else{
			termino = true;
		}
	}
	
	if(response != Gtk::RESPONSE_ACCEPT){
		return false;
	}
	else{
		termino = false;
		string nombreTemp("");
		int nColor = 0;
		
		entradaIP.set_editable(false);
		
		Gtk::HBox hNombre, hColor;
		Gtk::HSeparator hs, hs2, hs3;
		Gtk::Label lNombre("Ingrese su nombre de usuario: ");
		Gtk::Entry entradaNombre;
		hNombre.pack_start(lNombre, true, true, 0);
		hNombre.pack_start(entradaNombre, true, true, 0);
		Gtk::Label lColor("Elija un color: ");
		Gtk::ComboBoxText comboColor;
		cargarCombo(comboColor);
		hColor.pack_start(lColor, true, true, 0);
		hColor.pack_start(comboColor, true, true, 0);
		Gtk::Label lConectados("Información del servidor: ");
		conectados.set_size_request(this->get_width(), 150);
		this->get_vbox()->pack_start(hs, true, true, 10);
		this->get_vbox()->pack_start(hNombre);
		this->get_vbox()->pack_start(hs2, true, true, 10);
		this->get_vbox()->pack_start(hColor);
		this->get_vbox()->pack_start(hs3, true, true, 10);
		this->get_vbox()->pack_start(lConectados);
		this->get_vbox()->pack_start(conectados);
		
		this->show_all();
		
		
		while(!termino){
			entradaNombre.set_text(nombreTemp);
			comboColor.set_active(nColor);
			response = this->run();
			
			//boton UNIRSE
			if(response == Gtk::RESPONSE_ACCEPT){
				nombreTemp = entradaNombre.get_text();
				nColor = comboColor.get_active_row_number();
				if(entradaNombre.get_text_length() != 0){
					cliente.unirseAlJuego(nombreTemp, comboColor.get_active_text());
					termino = true;
				}
			}
			else{
				termino = true;
			}
		}
		
		if(response != Gtk::RESPONSE_ACCEPT){
			return false;
		}
		else{
			response = this->run();
			
			//boton ENTRAR
			if(response == Gtk::RESPONSE_ACCEPT){
				return true;
			}
			else{
				return false;
			}
		}
	}
}

void VentanaConexion :: cargarCombo(Gtk::ComboBoxText &comboBox){
	string colores[6] = {"violeta", "marron", "rojo", "verde", "amarillo", "azul"};
	
	for(int i = 0; i < 6; i++){
		comboBox.append_text(colores[i]);
	}
	comboBox.set_active(0);
}

void VentanaConexion :: mostrarConfiguraciones(Configuraciones *c){
	
	char cadena[256];
	string cad;
	msg.assign("Nombre del mapa: "+c->getNombreDelMundo()+"\n");
	
	sprintf(cadena, "%d", c->getCantidadDeJugadores());
	cad.assign(cadena);
	msg.append("Cantidad de jugadores: "+cad);
	
	Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
	infoBuffer->set_text(msg);
	conectados.set_buffer(infoBuffer);
}


void VentanaConexion::update() {
	Cliente* cl = dynamic_cast<Cliente*>(this->observable);
	if (cl != 0){
		switch(cl->getEstado()) {
		case(Cliente::CONECTADO): 
			this->mostrarConfiguraciones(cl->getConfiguracionesDelJuego());
			this->botonConectarse->set_label("Unirse");
			break;
		case(Cliente::ERROR_CONEXION):{ 
									hayError();
									break;
									}
		case(Cliente::DESCARGANDO_MAPA): 
									if(!error){
										if(1 != control+1){
											hayError();
										}
										else{
											control++;
											msg.append("\n\nDescargando archivos necesarios...");
											msg.append("\ni) Descargando mapa...");
											Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
											infoBuffer->set_text(msg);
											conectados.set_buffer(infoBuffer);
											this->botonConectarse->set_label("Entrar");
											this->botonConectarse->set_sensitive(false);
											finBarra = false;
											iniciarBarra();
										}
									}
									else{
										hayError();
									}
									break;
		case(Cliente::MAPA_DESCARGADO): 
									if(!error){
										if(2 != control+1){
											hayError();
										}
										else{
											control++;
											msg.append(" Mapa descargado.");
											Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
											infoBuffer->set_text(msg);
											conectados.set_buffer(infoBuffer);
										}
									}
									else{
										hayError();
									}
									break;
		case(Cliente::DESCARGANDO_IMAGEN):
									if(!error){
										if(3 != control+1){
											hayError();
										}
										else{
											control++;
											msg.append("\nii) Descargado imagen...");
											Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
											infoBuffer->set_text(msg);
											conectados.set_buffer(infoBuffer);
										}
									}
									else{
										hayError();
									}
									break;
		case(Cliente::IMAGEN_DESCARGADA):
									if(!error){
										if(4 != control+1){
											hayError();
										}
										else{
											control++;
											finBarra = true;
											msg.append(" Imagen descargada.");
											msg.append("\nArchivos descargados.");
											Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
											infoBuffer->set_text(msg);
											conectados.set_buffer(infoBuffer);
											this->show_all();
										}
									}
									else{
										hayError();
									}
									break;
									
		case(Cliente::UNIDO_AL_JUEGO):
									if(!error){
										if(5 != control+1){
											hayError();
										}
										else{
											msg.append("\n Puede unirse al juego.");
											Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
											infoBuffer->set_text(msg);
											this->botonConectarse->set_sensitive(true);
										}
									}
									else{
										hayError();
									}
									break;
									
		}
	}
}

void VentanaConexion :: hayError(){
	msg.assign("ERROR EN LA CONEXION");
	Glib::RefPtr<Gtk::TextBuffer> infoBuffer = Gtk::TextBuffer::create();
	infoBuffer->set_text(msg);
	conectados.set_buffer(infoBuffer);
	this->botonConectarse->set_sensitive(false);
	error = true;
}
		
void VentanaConexion :: iniciarBarra(){
	int timeout;
	this->get_vbox()->pack_start(bar);
	
	timeout = Glib::signal_timeout().connect(sigc::mem_fun(*this,
		            &VentanaConexion::dibujarBarra), 20 );
	
	this->show_all();
	
	return;
}

bool VentanaConexion :: dibujarBarra(){
	
	if(!finBarra){
		bar.set_text("Descargando");
		bar.set_pulse_step(0.05);
		bar.pulse();
		return true;
	}
	else{
		bar.set_fraction(1);
		bar.set_text("Fin descarga");
		return false;
	}
}

VentanaConexion :: ~VentanaConexion(){
	delete this->botonConectarse;
}
